// #include <stdio.h>
// #include <stdlib.h>
// #include <unistd.h>
// #include <pthread.h>
// #include <iostream>

// int tickets = 10;
// pthread_mutex_t ticket_mutex = PTHREAD_MUTEX_INITIALIZER;

// void *getTickets(void *)
// {
//     while (true)
//     {
//         sleep(1);
//         pthread_mutex_lock(&ticket_mutex);
//         if (tickets > 0)
//         {
//             printf("%p:%d\n", pthread_self(), tickets);
//             --tickets;
//             pthread_mutex_unlock(&ticket_mutex);
//         }
//         else
//         {
//             pthread_mutex_unlock(&ticket_mutex);
//             break;
//         }
//     }
//     return nullptr;
// }

// int main()
// {
//     pthread_t t[3];
//     int i = 0;
//     for (; i < 3; i++)
//     {
//         pthread_create(&t[i], nullptr, getTickets, nullptr);
//     }

//     for (i = 0; i < 3; ++i)
//     {
//         pthread_join(t[i], nullptr);
//     }

//     std::cout << "final num: " << tickets << std::endl;

//     return 0;
// }

// // void *my_thread_function(void *arg)
// // {
// //     // 线程执行的代码
// //     printf("Thread is running...\n");
// //     sleep(3); // 模拟耗时操作
// //     printf("Thread is done.\n");
// //     return NULL; // 线程返回
// // }

// // int main()
// // {
// //     pthread_t thread_id;

// //     // 创建线程
// //     if (pthread_create(&thread_id, NULL, my_thread_function, NULL) != 0)
// //     {
// //         perror("Failed to create thread");
// //         return EXIT_FAILURE;
// //     }

// //     // 分离线程
// //     if (pthread_detach(thread_id) != 0)
// //     {
// //         perror("Failed to detach thread");
// //         return EXIT_FAILURE;
// //     }

// //     // 主线程继续执行
// //     printf("Main thread continues...\n");
// //     sleep(4); // 主线程也模拟耗时操作

// //     printf("Main thread is done.\n");

// //     return 0;
// // }

#include <iostream>
#include <pthread.h>
#include <unistd.h>

int tickets = 10000;                                      // 全局变量，表示剩余的门票数量
pthread_mutex_t ticket_mutex = PTHREAD_MUTEX_INITIALIZER; // 静态分配互斥量

// 线程函数，模拟抢票操作
void *getTickets(void *)
{
    while (true)
    {
        // 模拟短暂的延迟
        usleep(1000);

        // 加锁
        pthread_mutex_lock(&ticket_mutex);

        // 临界区操作，现在受互斥量保护
        if (tickets > 0)
        {
            // 打印当前线程和剩余票数
            printf("%ld: %d\n", pthread_self(), tickets);

            // 安全地减少票数
            tickets--;

            // // 如果剩余票数为0，则退出循环
            // if (tickets == 0)
            // {
            //     break;
            // }

            // 解锁
            pthread_mutex_unlock(&ticket_mutex);
        }
        else
        {
            // 解锁
            pthread_mutex_unlock(&ticket_mutex);
            break;
        }
    }
    return nullptr;
}

int main()
{
    pthread_t t1, t2, t3;

    // 创建三个线程
    pthread_create(&t1, nullptr, getTickets, nullptr);
    pthread_create(&t2, nullptr, getTickets, nullptr);
    pthread_create(&t3, nullptr, getTickets, nullptr);

    // 等待所有线程执行完毕
    pthread_join(t1, nullptr);
    pthread_join(t2, nullptr);
    pthread_join(t3, nullptr);

    // 输出最后剩余的票数（现在应该是准确的）
    std::cout << "最终剩余票数: " << tickets << std::endl;

    return 0;
}